
package com.udc.medLine.factory;

import java.util.List;

import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Venda;
import com.udc.medLine.exception.BaseException;
import com.udc.medLine.exception.CampoDuplicadoException;
import com.udc.medLine.persistence.VendaDAO;

public class FactoryVenda {

	private VendaDAO vendaDAO;

	/**
	 * 
	 */
	public FactoryVenda() {
		super();
		vendaDAO = new VendaDAO();
		// TODO Stub de construtor gerado automaticamente
	}

	public Venda getVenda() {
		return (vendaDAO.getVenda());
	}

	public void setVenda(Venda new_venda) {
		this.vendaDAO.setVenda(new_venda);
	}

	public void insert() throws Exception {
		vendaDAO.insert();
	}

	public void delete() throws Exception {
		vendaDAO.delete();
	}

	public void update() throws Exception {
		vendaDAO.update();
	}

	public List getVenda(String campo, String valor){
		List lista;
		try {
			lista = vendaDAO.search("From venda in class Venda WHERE "+campo+" ='"+ valor + "'");
		}
		catch (Exception e){
			return null;
		}
		return lista;
	}
	
	public List getListaVenda(){		
		List lista;	
		try{		
			lista = vendaDAO.search("From venda in class Venda");
		}
		catch (Exception e){
		 	return null;
		}
		return lista;		
	}
	
	public Venda obterVenda() throws Exception {
		return vendaDAO.retrive();
	}
	
	public List search(CondicaoVO condicao) throws Exception {
		String hql = "From venda in class Venda WHERE ";
		String campoSQL = null;
		String operadorSQL = null;
		String valorHQL = "'" + condicao.getValor() + "'";
		if (condicao.getCampo().equals("id")) {
			valorHQL = condicao.getValor();
			campoSQL = " venda.id ";
			if (condicao.getOperador().equals("contem")) {
				condicao.setOperador("igual");				
			}
		} else if (condicao.getCampo().equals("data")) {
			campoSQL = " venda.data ";
		} else if (condicao.getCampo().equals("total")) {
			campoSQL = " venda.total ";
		} else if (condicao.getCampo().equals("status")) {
			campoSQL = " venda.status.nome ";
		} else if (condicao.getCampo().equals("usuario")) {
			campoSQL = " venda.cliente.usuario ";
		}
		if (condicao.getOperador().equals("igual")) {
			operadorSQL = "=";
		} else if (condicao.getOperador().equals("diferente")) {
			operadorSQL = "!=";
		} else if (condicao.getOperador().equals("maior")) {
			operadorSQL = ">";
		} else if (condicao.getOperador().equals("menor")) {
			operadorSQL = "<";
		} else if (condicao.getOperador().equals("contem")) {
			operadorSQL = "like";
			valorHQL = "('%" + condicao.getValor() + "%')";
		}
		hql += campoSQL + " " + operadorSQL + valorHQL;
		return  vendaDAO.search(hql);	
	}

	public List search(List condicoes) throws Exception {
		String hql = "From venda in class Venda";
		if (condicoes.size() > 0) {
			hql += " where ";
		}

		for (int i = 0; i < condicoes.size(); i++) {

			CondicaoVO condicao = (CondicaoVO) condicoes.get(i);
			
			String valorHQL = "'" + condicao.getValor() + "'";

			if (condicao.getCampo().equals("cliente")) {

				hql += " venda.cliente.nome ";
			} else if (condicao.getCampo().equals("status")) {

				hql += " venda.status.nome";
			} else if (condicao.getCampo().equals("id")) {
				valorHQL = condicao.getValor();
				hql += " venda.id";
			} else if (condicao.getCampo().equals("data")) {

				hql += " venda.data";
			}
			if (condicao.getOperador().equals("igual")) {
				hql += "=";
			} else if (condicao.getOperador().equals("diferente")) {
				hql += "!=";
			} else if (condicao.getOperador().equals("maior")) {
				hql += ">";
			} else if (condicao.getOperador().equals("menor")) {
				hql += "<";
				hql +=  condicao.getValor();
			} else if (condicao.getOperador().equals("contem")) {
				hql += "like";
				valorHQL = "('%" + condicao.getValor() + "%')";
			}
			
			hql += valorHQL;

			
			if (i < condicoes.size() - 1) {

				hql += " and ";

			}
		}
		System.out.println(hql);
		return vendaDAO.search(hql);	
	}

}
